<?php
namespace App\Http\Service;
use App\Http\Service\BaseService;
use InvalidArgumentException;
class ContentScoringService  extends BaseService
{
    
    
    public function __construct()
    {
        parent::__construct();
       
    }

    /**
     * 计算爆料内容的基础分
     *
     * @param float $finalPrice 商品到手价
     * @param float $userReportPrice 用户爆料价
     * @param int $view_count 浏览量
     * @param int $comment_count 评论数
     * @param int $collect_count 收藏数
     * @param int $orders 下单数
     * @return float 基础分（0.6 * 优惠力度 + 0.4 * 热门度）
     */
    public static function calculateReportScore($finalPrice,$userReportPrice,$view_count,$comment_count,$collect_count,$orders)
    {
        // 计算优惠力度
        $fenshu=$finalPrice - $userReportPrice;
        if($fenshu==0){
            $discountStrength =0;
        }else{
            $discountStrength = ($finalPrice - $userReportPrice) / $finalPrice;
        }
        
        
        
        //dd($discountStrength);
        // 计算热门度
        $popularity = log(
            $view_count * 0.3 + 
            $comment_count * 0.7 + 
            $collect_count * 0.5 + 
            $orders * 1.5 + 
            1
        ) / log(1000);

        // 基础分 = 0.6 * 优惠力度 + 0.4 * 热门度
        $baseScore = 0.6 * $discountStrength + 0.4 * $popularity;
        
        return $baseScore;
    }

    /**
     * 计算逛逛内容的热门度
     * @param int $view_count 浏览量
     * @param int $comment_count 评论数
     * @param int $collect_count 收藏数
     * @param int $orders 下单数
     * @return float 热门度
     */
    public static function calculatePopularityScore($view_count,$comment_count,$collect_count,$orders) 
    {
        $popularity = log(
            $view_count * 0.3 + 
            $comment_count * 0.7 + 
            $collect_count * 0.5 + 
            $orders * 1.5 + 
            1
        ) / log(1000);

        return $popularity;
    }

    /**
     * 计算时间衰减因子
     * @param int $daysPassed 距离发布的天数
     * @return float 时间衰减因子（e^{-0.1 * days}）
     */
    public static function calculateTimeDecayFactor($daysPassed)
    {
        return exp(-0.1 * $daysPassed);
    }

    /**
     * 计算最终得分（基础分 × 时间衰减因子）
     * @param float $baseScore 基础分
     * @param int $daysPassed 距离发布的天数
     * @return float 最终得分
     */
    public static function calculateFinalScore($baseScore,$daysPassed)
    {
        $timeDecay = self::calculateTimeDecayFactor($daysPassed);
        return $baseScore * $timeDecay;
    }

    /**
     * 计算当天热度得分（基于24小时内的互动数据）
     */
/*    public static function calculateDailyHotScore($content)
    {
        //die("9999");
        //dd($content);
        // 获取当前时间
        $now = time();
        
        // 获取发布时间
        $publishTime = strtotime($content['publish_time'] ?? '1970-01-01');
        
        // 计算发布天数
        $daysSincePublish = max(0, floor(($now - $publishTime) / 86400));
        
        // 基础互动数据（如果没有24小时数据，使用总量并按时间衰减）
        $viewCount = $content['view_count'] ?? 0;
        $commentCount = $content['comment_count'] ?? 0;
        $collectCount = $content['collect_count'] ?? 0;
        $ordersCount = $content['sales_count'] ?? 0;
        
        // 计算时间衰减因子（新内容权重更高）
        $timeDecay = exp(-0.2 * $daysSincePublish);
        
        // 计算当天热度（互动数据 × 时间衰减）
        $hotScore = (
            $viewCount * 0.3 + 
            $commentCount * 0.7 + 
            $collectCount * 0.5 + 
            $ordersCount * 1.5
        ) * $timeDecay;
        
        // 如果是今天发布的内容，额外加成
        $isToday = date('Y-m-d', $publishTime) === date('Y-m-d', $now);
        if ($isToday) {
            $hotScore *= 1.5; // 今天发布的内容热度加成50%
        }
        ///dd($hotScore);
        return $hotScore;
    }*/


    public static function calculateDailyHotScore7777777($content)
    {
        // 获取当前时间
        $now = time();
        
        // 获取发布时间
        $publishTime = strtotime($content['publish_time'] ?? '1970-01-01');
        
        // 计算发布时间距离当前时间的小时数
        $hoursSincePublish = max(0, floor(($now - $publishTime) / 3600));
        
        // 获取当天浏览量（直接使用view_count字段）
        $viewCount = $content['view_count'] ?? 0;
        
        // 计算每小时浏览量率
        $hourlyViewRate = $hoursSincePublish > 0 ? $viewCount / $hoursSincePublish : $viewCount;
        
        // 估算24小时浏览量（如果发布不足24小时，使用实际数据；如果超过24小时，按比例估算）
        if ($hoursSincePublish <= 24) {
            $estimated24hViews = $viewCount;
        } else {
            $estimated24hViews = $hourlyViewRate * 24;
        }
        
        // 计算时间衰减因子（新内容权重更高）
        // 发布超过24小时的内容会随时间衰减
        $timeDecay = $hoursSincePublish <= 24 ? 1.0 : exp(-0.15 * (($hoursSincePublish - 24) / 24));
        
        // 计算当天热度（估算的24小时浏览量 × 时间衰减）
        $hotScore = $estimated24hViews * $timeDecay;
        
        // 如果是今天发布的内容，额外加成
        $isToday = date('Y-m-d', $publishTime) === date('Y-m-d', $now);
        if ($isToday) {
            $hotScore *= 5.5; // 今天发布的内容热度加成50%
        }
        
        return $hotScore;
    }


public static function calculateDailyHotScore6666($content)
{
    // 获取当前时间
    $now = time();
    
    // 获取发布时间
    $publishTime = strtotime($content['publish_time'] ?? '1970-01-01');
    
    // 计算发布时间距离当前时间的小时数
    $hoursSincePublish = max(0, floor(($now - $publishTime) / 3600));
    
    // 获取当天浏览量
    $viewCount = $content['view_count'] ?? 0;
    
    // 判断是否为当天发布的内容
    $isToday = date('Y-m-d', $publishTime) === date('Y-m-d', $now);
    
    // 判断是否为近期内容（24小时内）
    $isRecent = $hoursSincePublish <= 24;
    
    // 计算当天的时间进度（0-1之间）
    $todayStart = strtotime(date('Y-m-d 00:00:00', $now));
    $hoursSinceTodayStart = max(0, floor(($now - $todayStart) / 3600));
    $todayProgress = min(1.0, $hoursSinceTodayStart / 24);
    
    // 主要逻辑：如果当天没有最新数据，主要依据发布时间
    if (!$isToday && !$isRecent) {
        // 非当天且非近期内容：主要依据发布时间计算热度
        $hotScore = self::calculateByPublishTime($viewCount, $hoursSincePublish, $publishTime);
    } else {
        // 当天或近期内容：使用原有的综合计算方法
        $hotScore = self::calculateComprehensiveScore($viewCount, $hoursSincePublish, $isToday, $todayProgress);
    }
    
    return round($hotScore, 2);
}

/**
 * 依据发布时间计算热度（用于非当天内容）
 */
private static function calculateByPublishTime($viewCount, $hoursSincePublish, $publishTime)
{
    // 基础热度基于总浏览量
    $baseScore = $viewCount;
    
    // 发布时间衰减因子（越新的内容权重越高）
    $timeDecay = exp(-0.2 * ($hoursSincePublish / 24)); // 每24小时衰减
    
    // 发布时间权重（基于发布时间的小时数，早上8点到晚上10点权重较高）
    $publishHour = date('H', $publishTime);
    $timeWeight = 1.0;
    
    if ($publishHour >= 8 && $publishHour <= 22) {
        // 黄金时段发布：权重较高
        $timeWeight = 1.2 + (($publishHour - 8) / 14) * 0.3; // 1.2-1.5
    }
    
    $hotScore = $baseScore * $timeDecay * $timeWeight;
    
    return $hotScore;
}

/**
 * 综合计算方法（用于当天或近期内容）
 */
private static function calculateComprehensiveScore($viewCount, $hoursSincePublish, $isToday, $todayProgress)
{
    // 计算每小时浏览量率
    $hourlyViewRate = $hoursSincePublish > 0 ? $viewCount / $hoursSincePublish : $viewCount;
    
    // 估算24小时浏览量
    if ($hoursSincePublish <= 24) {
        $estimated24hViews = $viewCount;
    } else {
        $estimated24hViews = $hourlyViewRate * 24;
    }
    
    // 时间衰减因子
    $timeDecay = $hoursSincePublish <= 24 ? 1.0 : exp(-0.15 * (($hoursSincePublish - 24) / 24));
    
    // 计算热度分数
    $hotScore = $estimated24hViews * $timeDecay;
    
    // 当天发布的内容加成
    if ($isToday) {
        // 当天时间进度权重（当天越晚，权重越高）
        $todayWeight = 1.0 + $todayProgress * 0.5; // 增加0-50%
        $hotScore *= (1.5 * $todayWeight); // 基础加成50% + 时间进度加成
    }
    
    return $hotScore;
}

/**
 * 备用方法：如果需要更简单的逻辑，可以使用这个版本
 */
public static function calculateDailyHotScoreSimple($content)
{
    $now = time();
    $publishTime = strtotime($content['publish_time'] ?? '1970-01-01');
    $viewCount = $content['view_count'] ?? 0;
    $hoursSincePublish = max(0, floor(($now - $publishTime) / 3600));
    
    $isToday = date('Y-m-d', $publishTime) === date('Y-m-d', $now);
    $isRecent = $hoursSincePublish <= 24;
    
    // 简单逻辑：当天内容使用浏览量+时间加成，非当天内容主要看发布时间
    if ($isToday) {
        // 当天内容：浏览量权重 + 时间加成
        $todayProgress = (date('H', $now) / 24); // 当天进度
        return $viewCount * (1.5 + $todayProgress);
    } elseif ($isRecent) {
        // 近期内容：中等权重
        return $viewCount * 1.2;
    } else {
        // 非当天非近期：主要依据发布时间衰减
        $daysSincePublish = $hoursSincePublish / 24;
        $timeDecay = exp(-0.15 * $daysSincePublish); // 每日衰减
        return $viewCount * $timeDecay;
    }
}

/*
最热逻辑 所有当天发布的内容排在最前面

当天内容内部按浏览量从高到低排序

非当天内容按浏览量从高到低排在后面*/
public static function calculateDailyHotScore($content)
{
    $now = time();
    $publishTime = strtotime($content['publish_time'] ?? '1970-01-01');
    $viewCount = $content['view_count'] ?? 0;
    
    // 判断是否为当天发布的内容
    $isToday = date('Y-m-d', $publishTime) === date('Y-m-d', $now);
    
    if ($isToday) {
        // 当天内容：基础分100万 + 实际浏览量，确保排在所有非当天内容前面
        return 1000000 + $viewCount;
    } else {
        // 非当天内容：直接返回浏览量，按浏览量排序
        return $viewCount;
    }
}







    /**
     * 对内容列表进行排序（综合、最新、最热、高佣金、高销量）
     * @param array $contents 内容列表（需包含必要字段）
     * @param string $sortMode 排序模式（'comprehensive', 'latest', 'hottest', 'high_commission', 'high_sales'）
     * @return array 排序后的内容列表
     */
    public static function sortContents($contents,$sortMode = 'comprehensive')
    {
        //dd($contents);
        switch ($sortMode) {
            case 'comprehensive': // 综合（按最终得分排序）
                usort($contents, function ($a, $b) {
                    $base_score_a=0;
                    $days_passed_a=0;
                    $base_score_b=0;
                    $days_passed_b=0;
                    if(isset($a['base_score'])){
                        $base_score_a=$a['base_score'];
                        $days_passed_a=$a['days_passed'];
                        $base_score_b=$b['base_score'];
                        $days_passed_b=$b['days_passed'];
                    }/*else{
                        dd($a);
                    }*/
                    
                    
                    $scoreA = self::calculateFinalScore($base_score_a,$days_passed_a);
                    //dd($scoreA);
                    $scoreB = self::calculateFinalScore($base_score_b,$days_passed_b);
                    return $scoreB <=> $scoreA; // 降序
                });
                break;

            case 'latest': // 最新（按发布时间降序）
                usort($contents, function ($a, $b) {
                    return $b['publish_time'] <=> $a['publish_time'];
                });
                break;

            case 'hottest': // 最热（按当天最热浏览量降序）
               /*  //dd($contents);
                usort($contents, function ($a, $b) {
                   // dd($a);
                    $hotScoreA = self::calculateDailyHotScore($a);
                    $hotScoreB = self::calculateDailyHotScore($b);
                    return $hotScoreB <=> $hotScoreA;
                });*/
                usort($contents, function($a, $b) {
                    $scoreA = self::calculateDailyHotScore($a);
                    $scoreB = self::calculateDailyHotScore($b);
                    
                    // 降序排列：分数高的在前
                    if ($scoreA == $scoreB) {
                        return 0;
                    }
                    return ($scoreA > $scoreB) ? -1 : 1;
                });
                
                return $contents;
                break;

            case 'high_commission': // 高佣金（按佣金降序）
                usort($contents, function ($a, $b) {
                    return $b['commission_amount'] <=> $a['commission_amount'];
                });
                break;

            case 'high_sales': // 高销量（按销量降序）
                usort($contents, function ($a, $b) {
                    return $b['sales_count'] <=> $a['sales_count'];
                });
                break;

            default:
                throw new InvalidArgumentException("Invalid sort mode: {$sortMode}");
        }

        return $contents;
    }
}

